<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    var list = [1, 2, 3, 3, 2, 4, 1, 4, 3, 2, 1, 3, 2];

    // 传统JS对象的键名字符串类型  => 唯一的
    // Map数据结构 键名任意类型

    // 原理: 遍历数组 把数组中的元素作为对象的键名
    var m = new Map();
    for (var i = 0; i < list.length; i++) {
        var item = list[i]; // 数组中的元素
        if (m.has(item)) { // 把数组的元素作为对象的键名 => 判断键名是否在对象中已存在
            var num = m.get(item);
            num++;
            m.set(item, num);
        } else {
            m.set(item, 1); // obj[1] = 1   obj[2] = 1
        }
    }

    console.log(m);

    // 去重
    // var unique = [];
    // m.forEach(function (val, key) {
    //     unique.push(key);
    // })
    // console.log(unique);

    var sortArr = [];

    m.forEach(function (val, key) {  // 键名 => 元素   键值 => 元素的个数
        var arr = new Array(val).fill(key); //生成对应长度的数组 用指定元素填充
        sortArr = sortArr.concat(arr);
    })

    console.log(sortArr);





</script>

</html>